// 主要入口文件
import { createApp } from 'vue';
import App from './App.vue';

// 引入路由
import Router from '@/routers/index';

// 引入Vant UI
import Vant from 'vant';
// 引入Vant UI组件样式
import 'vant/lib/index.css';
// 引入封装请求
import Request from '@/services/request';
// 引入工具函数
import Utils from '@/utils/utils';
// 引入pinia
import { createPinia } from 'pinia';
// 引入pinia持久化插件
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
// 引入vue3cookie
import Cookies from 'vue3-cookies';

// 必须是先use(使用)后再mount(挂载),不然会报错...not a function
// 全局挂载
const app = createApp(App)
  .use(Router)
  .use(Vant)
  .use(Request)
  .use(createPinia().use(piniaPluginPersistedstate))
  .use(Utils)
  .use(Cookies)
  .mount('#app');

// 路由守卫（检查用户是否登录）
Router.beforeEach(async (to, from) => {
  // 获取当前跳转页面是否需要登录才能访问
  const IsLogin = to.meta?.IsLogin === true ? true : false
  // 需要登录才能访问
  if (IsLogin === false) {
    // 获取登录信息
    // 判断登录信息是否真实
    return true;
  }
  if (Object.getOwnPropertyNames(app.$business.value).length === 0) {
    // Object.getOwnPropertyNames 是 JavaScript 的一个内置方法，用于返回一个对象自身（非继承）的所有属性名（包括不可枚举的属性）组成的数组
    app.$fail('请先登录');
    // 跳转到登录页
    return { path: '/business/login' };
  }
  let id = app.$business.value.id ?? 0;
  // let mobile = app.$business.value.mobile ?? '';
  // 发起请求
  let result = await app.$http.post({
    url: '/business/check',
    params: {
      id,
      // mobile
    }
  })
  // 请求结果为成功
  if (result.code === 1) {
    app.$business.value = result.data;
    return true;
  } else {
    // 请求结果为失败
    app.$business.value = {}; // 清空用户信息
    app.$fail(result.msg);
    // 跳转到登录页
    return { path: '/business/login' };
  }
})